package com.hsu.hsurpc.server.tcp;

import com.hsu.hsurpc.server.HttpServer;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.net.NetServer;
import io.vertx.core.parsetools.RecordParser;

/**
 * 基于 Vert.x 实现的 TCP 服务器
 * @Author Hsu琛君珩
 * @Date 2024-09-23 10:28
 * @Description
 * @Version: v1.0.0
 */
public class VertxTcpServer implements HttpServer {

    /**
     * 处理请求数据
     *
     * @param requestData 客户端请求数据
     * @return 响应数据
     */
    private byte[] handleRequest(byte[] requestData) {
        return "Hello, client!".getBytes(); // 返回固定响应数据
    }

    /**
     * 启动 TCP 服务器并监听指定端口
     *
     * @param port 服务器监听端口
     */
    @Override
    public void doStart(int port) {
        Vertx vertx = Vertx.vertx(); // 创建 Vert.x 实例
        NetServer server = vertx.createNetServer(); // 创建 TCP 服务器
        // 处理客户端连接
        server.connectHandler(socket -> {
            // 创建 RecordParser，先读取消息头（消息头长度我们固定长度）
            RecordParser parser = RecordParser.newFixed(8);
            parser.setOutput(new Handler<Buffer>() {
                int size = -1; // 消息体长度
                Buffer resultBuffer = Buffer.buffer(); // 一次性读取完整的 头 + 体
                @Override
                public void handle(Buffer buffer) {
                    if (size == -1) {
                        // 从消息头读取消息体的长度 (从第4个字节开始读取消息体长度)
                        size = buffer.getInt(4);
                        parser.fixedSizeMode(size); // 设置 RecordParser 为消息体长度
                        resultBuffer.appendBuffer(buffer); // 将头信息存入 resultBuffer
                    } else {
                        resultBuffer.appendBuffer(buffer); // 将消息体添加到 resultBuffer 中
                        System.out.println(resultBuffer.toString());
                        // 重置 RecordParser 以准备下一次消息读取
                        parser.fixedSizeMode(8);
                        size = -1;
                        resultBuffer = Buffer.buffer(); // 重置缓冲区
                    }
                }
            });
            socket.handler(parser);
        });
        // 启动 TCP 并且监听指定端口
        server.listen(port, result -> {
            if (result.succeeded()) {
                System.out.println("TCP server started on port " + port);
            } else {
                System.err.println("Failed to start TCP server: " + result.cause());
            }
        });
    }

    public static void main(String[] args) {
        new VertxTcpServer().doStart(8888); // 启动服务器，监听 8888 端口
    }
}
